package com.haojin.java;

import org.junit.Test;

import java.util.Arrays;
import java.util.Comparator;

/**
 * @author .29.
 * @create 2022-04-04 20:18
 */
/*
一：说明：Java中的对象，正常情况下，只能进行比较：== 或 !=  。
        不能使用> 或 < 的，但在开发场景中，我们需要对多个对象进行排序，言外之意，就是需要比较会显得大小。
        如何实现？使用两个接口中的任何一个： Comparable / Comparator

二、Comparable接口与Comparator接口使用的对比：
Comparable接口的方式一旦指定，把凭证Comparable接口实现类的对象在任何位置都可以比较大小
Comparator接口的方式属于临时性的比较。

 */
public class CompareTest {
   /*
    //Comparable接口使用实例：  自然排序
    1.像String、包装类等实现了Comparable接口，重写了compareTo()方法，给出了比较两个对象大小的方式
    2.像String、包装类重写compareTo()方法以后，进行从小到大排序
    3.重写compareTo(obj)的规则：
    如果当前对象this大于形参的对象obj，返回正整数。
    如果当前对象this小于形参的对象obj，返回负整数。
    如果当前对象this等于形参的对象obj，返回零。
    4.对于自定义类，如果需要排序，我们可以让自定义类实现Comparable接口，重写compareTo()
    */
    @Test
    public  void  test1(){
        String[] arr = new String[]{"AA","CC","MM","JJ","BB","DD"};
        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr));
    }
    @Test
    public void test2(){
        Goods[] arr = new Goods[4];
        arr[0] = new Goods("LenovoMouse",34);
        arr[1] = new Goods("DellMouse",43);
        arr[2] = new Goods("XiaoMiMouse",12);
        arr[3] = new Goods("HuaWeiMouse",65);

        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr));
    }

    /*
    Comparator接口的使用：  定制排序
    1.背景：
    放元素的类型没有实现Java/lang.Comparable接口而又不方便修改代码，
    或者实现了java.lang.Comparable接口的排序规则不适合当前操作，那么
    可以考虑使用Comparator的对象来排序
    2.重写compare(Object1,Object2)方法，比较o1和o2的大小：
       如果方法返回正整数，o1大于o2
       如果方法返回负整数，o1小于o2
       如果方法返回零，o1等于o2
     */
    @Test
    public void test4(){
        String[] arr = new String[]{"AA","CC","MM","JJ","BB","DD"};
        Arrays.sort(arr, new Comparator(){
            //按照字符串从大到小的排序
            @Override
            public int compare(Object o1, Object o2) {
                if(o1 instanceof String && o2 instanceof String){
                    String arr1 = (String) o1;
                    String arr2 = (String) o2;
                    return -arr1.compareTo(arr2);
                }
                throw new RuntimeException("传入的数据类型不一致");
            }
        });
        System.out.println(Arrays.toString(arr));
    }
}
